﻿#include "FITKAcousticsNCTRegularTrimLayer.h"

#include "FITKAcousticsAbsMaterial.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITKAcousticsPhysics.h"

#include <QDebug>

namespace Acoustics
{
    void FITKAcousticsNCTRegularTrimLayer::initType(FITKAcousticsNCTAbstractLayObj::NCTLayUpType type)
    {
        if(type!=None){ 
            _type = type;
            return;
        }
        // Panel实体板 （没有流体材料、有固体材料）
        if(_fluidMaterialID == -1 && _solidMaterialID != -1)
        {
            _type = Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::Panel;
        }
        else if(_solidMaterialID == -1 && _fluidMaterialID != -1)// GAP缝隙 （有流体材料、没有固体材料）
        {
            _type = Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::Gap;
        }
        else if(_solidMaterialID != -1 && _fluidMaterialID != -1)//都有就是Foam泡沫或是纤维（有流体材料、有固体材料）
        {
            //从流体材料类型来判断是纤维还是泡沫
            //获取全局数据管理器
            auto globalData = FITKAPP->getGlobalData();

            if (!globalData)
            {
                return;// 如果转换失败，
            }

            //获取管理器
            Acoustics::FITKAcousticsPhysics* physics = globalData->getPhysicsData<Acoustics::FITKAcousticsPhysics>();

            if (!physics)
            {
                return ;//如果转换失败
            }

            //获取管理器
            auto manager = physics->getMaterialManager();

            if (!manager)
            {
                return;
            }

            auto materialData = manager->getDataByID(_solidMaterialID);//根据材料id获取材料数据指针

            if(!materialData)
            {
                return;
            }

            //转换类型
            Acoustics::FITKAcousticsAbsMaterial* data = dynamic_cast<Acoustics::FITKAcousticsAbsMaterial*>(materialData);

            if(!data)
            {
                return;
            }

            //根据材料判断是泡沫还是纤维
            switch (data->getAcousticsMaterialType())
            {
            case FITKAcousticsAbsMaterial::AcousticsMaterialType::Fiber:
                _type = Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::Fiber;
                break;

            case FITKAcousticsAbsMaterial::AcousticsMaterialType::Foam:
                _type = Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::Foam;
                break;

            default:
                _type = Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::Panel;
                _fluidMaterialID = -1;
                break;
            }
        }
        else
        {
            _type = Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::None;
        }

    }

    bool FITKAcousticsNCTRegularTrimLayer::copy(Core::FITKAbstractDataObject *obj)
    {
        //转换强制类型
        Acoustics::FITKAcousticsNCTRegularTrimLayer* regPtr = dynamic_cast<Acoustics::FITKAcousticsNCTRegularTrimLayer*>(obj);

        if(nullptr != regPtr)//判断是否转换成功
        {
            //复制成员变量
            _solidMaterialID = regPtr->getSolidMaterialID();
            _fluidMaterialID = regPtr->getFluidMaterialID();
            _lossFactor = regPtr->getLossFactor();
            initType();
        }

        // 调用父类的方法
        return Acoustics::FITKAcousticsNCTAbstractLayObj::copy(obj);
    }

    FITKAcousticsNCTAbstractLayObj::NCTLayUpType FITKAcousticsNCTRegularTrimLayer::getNCTLayUpType()
    {
        return _type;
    }

    double FITKAcousticsNCTRegularTrimLayer::getMassPerUnitArea()
    {
        //获取固体id
        //获取全局数据管理器
        auto globalData = FITKAPP->getGlobalData();

        if (!globalData)
        {
            return 0;// 如果转换失败，名称无法填写
        }

        //获取管理器
        Acoustics::FITKAcousticsPhysics* physics = globalData->getPhysicsData<Acoustics::FITKAcousticsPhysics>();

        if (!physics)
        {
            return 0;  // 如果转换失败，名称无法填写
        }

        //获取管理器
        auto manager = physics->getMaterialManager();

        if (!manager)
        {
            return 0;
        }


        int id = -1;
        if(_type == Acoustics::FITKAcousticsNCTAbstractLayObj::NCTLayUpType::Gap)//当类型为缝隙（流体时 材料id转换为流体id）
        {
            id = _fluidMaterialID;
        }
        else
        {
            id = _solidMaterialID;
        }

        auto materialData = manager->getDataByID(id);

        if(!materialData)
        {
            return 0;
        }

        //转换类型
        Acoustics::FITKAcousticsAbsMaterial* data = dynamic_cast<Acoustics::FITKAcousticsAbsMaterial*>(materialData);

        if(!data)
        {
            return 0;
        }

        return getThickness() * data->getDensity();
    }

    // 获取流体材料的ID
    int FITKAcousticsNCTRegularTrimLayer::getFluidMaterialID()
    {
        return _fluidMaterialID;  // 返回流体材料ID
    }

    // 设置流体材料的ID
    void FITKAcousticsNCTRegularTrimLayer::setFluidMaterialID(int id)
    {
        _fluidMaterialID = id;  // 设置流体材料ID
    }

    // 获取固体材料的ID
    int FITKAcousticsNCTRegularTrimLayer::getSolidMaterialID()
    {
        return _solidMaterialID;  // 返回固体材料ID
    }

    // 设置固体材料的ID
    void FITKAcousticsNCTRegularTrimLayer::setSolidMaterialID(int id)
    {
        _solidMaterialID = id;  // 设置固体材料ID
    }

    // 获取损耗因子
    double FITKAcousticsNCTRegularTrimLayer::getLossFactor()
    {
        return _lossFactor;  // 返回损耗因子
    }

    // 设置损耗因子
    void FITKAcousticsNCTRegularTrimLayer::setLossFactor(double lossFactor)
    {
        _lossFactor = lossFactor;  // 设置损耗因子
    }

}
